﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using CruzDelSur.Dominio;
using NHibernate;
using NHibernate.Criterion;

namespace CruzDelSur.Persistencia
{
    public class ServicioTramoDAO : BaseDAO<ServicioTramo, string>, IServicioTramoDAO
    {
        public ICollection<Tramo> ListarServiciosTramos(string codServicio)
        {
            using (ISession sesion = NHibernateHelper.AbrirSesion())
            {
                
                ICollection<Tramo> resultado = sesion.CreateSQLQuery("SELECT t.codTramo as Codigo, t.desTramo as Descripcion " +
                    ", s.estServicioTramo as Estado, t.codCreadoPor as UsuarioCreado, t.fecCreado as FechaCreacion, " +
                    " t.codModificadoPor as UsuarioModificado, t.fecModificado as FechaModificacion, s.fecBaja as FechaBaja " +
                    "FROM SE_TB_Servicio_Tramo AS s INNER JOIN SE_TB_Tramo AS t ON s.codTramo = t.codTramo " +
                    "WHERE  (s.codServicio = :codServ)")
                      .SetParameter("codServ", codServicio)
                      .SetResultTransformer(new NHibernate.Transform.AliasToBeanResultTransformer(typeof(Tramo)))
                      .List<Tramo>();
                return resultado;
            }

        }

        public void DarBaja(string codServicio, DateTime fecBaja)
        {
            using (ISession session = NHibernateHelper.AbrirSesion())
            {
                using (ITransaction transaction = session.BeginTransaction())
                {
                    session.CreateQuery("update ServicioTramo set FechaBaja= :fecBaja, Estado= :est where Servicio = :codServ")
                        .SetString("codServ", codServicio)
                        .SetDateTime("fecBaja", fecBaja)
                        .SetString("est", Servicio.INACTIVO)
                        .ExecuteUpdate();
                    transaction.Commit();
                }
            }
        }

        public Tramo ObtenerTramo(string codServicio, string codTramo)
        {
            using (ISession sesion = NHibernateHelper.AbrirSesion())
            {
                IList<Tramo> resultado = sesion.CreateSQLQuery("SELECT t.codTramo as Codigo, t.desTramo as Descripcion " +
                    ", s.estServicioTramo as Estado, t.codCreadoPor as UsuarioCreado, t.fecCreado as FechaCreacion, " +
                    " t.codModificadoPor as UsuarioModificado, t.fecModificado as FechaModificacion, s.fecBaja as FechaBaja " +
                    "FROM SE_TB_Servicio_Tramo AS s INNER JOIN SE_TB_Tramo AS t ON s.codTramo = t.codTramo " +
                    "WHERE  (s.codServicio = :codServ) AND (s.codTramo = :codigoTramo)")
                      .SetParameter("codigoTramo", codTramo)
                      .SetParameter("codServ", codServicio)
                      .SetResultTransformer(new NHibernate.Transform.AliasToBeanResultTransformer(typeof(Tramo)))
                      .List<Tramo>();
                if (resultado.Count == 1) return resultado.First();
                else return null;
            }
        }

        public void DarBajaTramo(ServicioTramo st)
        {
            using (ISession session = NHibernateHelper.AbrirSesion())
            {
                using (ITransaction transaction = session.BeginTransaction())
                {
                    session.CreateQuery("update ServicioTramo set " +
                        "FechaBaja= :fecBaja, Estado= :est " + 
                        "where Servicio = :codServ and Tramo = :codTramo"
                        )
                        .SetString("codServ", st.Servicio)
                        .SetString("codTramo", st.Tramo)
                        .SetString("est", Servicio.INACTIVO)
                        .SetDateTime("fecBaja", st.FechaBaja)
                        .ExecuteUpdate();
                    transaction.Commit();
                }
            }
        }
        public void ActualizarServicioTramo(ServicioTramo st)
        {
            using (ISession session = NHibernateHelper.AbrirSesion())
            {
                using (ITransaction transaction = session.BeginTransaction())
                {
                    session.CreateQuery("update ServicioTramo set " +
                        "FlagServicioTramo= :flag " +
                        "where Servicio = :codServ and Tramo = :codTramo"
                        )
                        .SetString("codServ", st.Servicio)
                        .SetString("codTramo", st.Tramo)
                        .SetBoolean("flag", st.FlagServicioTramo)
                        .ExecuteUpdate();
                    transaction.Commit();
                }
            }
        }
        public bool ObtenerFlagServicioEspecial(string codServicio)
        {
            using (ISession sesion = NHibernateHelper.AbrirSesion())
            {
                IList<object> resultado = sesion.CreateSQLQuery("SELECT s.codServicio " +
                    "FROM SE_TB_Servicio_Tramo AS s " +
                    "WHERE  (s.codServicio = :codServ) AND (s.flaServicioTramo = :flag)")
                      .SetParameter("codServ", codServicio)
                      .SetParameter("flag", true)
                      .List<object>();
                if (resultado.Count >= 1) return true;
                else return false;
            }
        }
    }
}
